home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The CDPD Public Domain Collection for CDTV 4
/
CDPD_IV.bin
/
e
/
mailinglists
/
amigae.0294feb.archive
/
000031_donews!crash!rb…rmstadt.de!anh_Tue, 8 Feb 94 07:46:43 PST.msg
< prev
next >
Wrap
Internet Message Format
|
1994-05-26
|
47KB
Received: by bkhouse.cts.com (V1.17-beta/Amiga)
id <1rgl@bkhouse.cts.com>; Tue, 8 Feb 94 07:46:43 PST
Received: from crash by donews.cts.com with uucp
(Smail3.1.28.1 #18) id m0pTeMY-0001NlC; Mon, 7 Feb 94 14:23 PST
Received: from rbhp89.rbg.informatik.th-darmstadt.de by crash.cts.com with smtp
(Smail3.1.28.1 #18) id m0pTWIR-00011XC; Mon, 7 Feb 94 05:46 PST
Received: from rbhp48.rbg.informatik.th-darmstadt.de by rbhp89.rbg.informatik.th-darmstadt.de with SMTP
(1.36.108.4/15.6) id AA16024; Mon, 7 Feb 1994 14:46:47 +0100
Received: by rbhp48.rbg.informatik.th-darmstadt.de
(1.36.108.4/15.6) id AA04970; Mon, 7 Feb 1994 14:46:16 +0100
Message-Id: <m0pTWIR-00011XC@crash.cts.com>
Date: Mon, 7 Feb 94 14:46:15 MEZ
Full-Name: Olivier Anh
In-Reply-To: <940203183516.204136b3@iccgcc.cs.hh.ab.com>; from "THORNTONJ@beast.cs.hh.ab.com" at Feb 3, 94 6:35 pm
Mailer: Elm [revision: 66.25]
From: Olivier Anh <anh@rbhp56.rbg.informatik.th-darmstadt.de>
To: AmigaE@bkhouse.cts.com (The AmigaE Mailing List)
Subject: Re: Help with screens
Hi Jessie !
> Just a quick question. How do you get windows and cons to
> open up on a screen that is opened with OpenS().
The only way I know is avalaible under 2.0. You must open a Public Screen. Then
open a file with Open() named for example 'CON:0/0/640/100/Shell'.
I don't know the possibility of the new 2.0 shell ( I mean options like /CLOSE
/WAIT...) there is probably a /PUBLIC option...
Under 1.3, opening a shell on a private screen (only the WB is public) is not
possible. Or I don't know how to do :)
Bye,...
--
-------------------------------------------------------------------------------
/ / Olivier ANH (ERAMUS Student) |' And may the Force be with You ! '
\ X / anh@rbg.informatik.th-darmstadt.de | - Return of the Jedi -
-------------------------------------------------------------------------------
From donews!crash!rbhp56.rbg.informatik.th-darmstadt.de!anh Tue, 8 Feb 94 07:46:52 PST
Received: by bkhouse.cts.com (V1.17-beta/Amiga)
id <1rgq@bkhouse.cts.com>; Tue, 8 Feb 94 07:46:52 PST
Received: from crash by donews.cts.com with uucp
(Smail3.1.28.1 #18) id m0pTeMb-0001o1C; Mon, 7 Feb 94 14:23 PST
Received: from rbhp89.rbg.informatik.th-darmstadt.de by crash.cts.com with smtp
(Smail3.1.28.1 #18) id m0pTWNZ-0000WmC; Mon, 7 Feb 94 05:51 PST
Received: from rbhp48.rbg.informatik.th-darmstadt.de by rbhp89.rbg.informatik.th-darmstadt.de with SMTP
(1.36.108.4/15.6) id AA16051; Mon, 7 Feb 1994 14:52:10 +0100
Received: by rbhp48.rbg.informatik.th-darmstadt.de
(1.36.108.4/15.6) id AA04998; Mon, 7 Feb 1994 14:51:40 +0100
Message-Id: <m0pTWNZ-0000WmC@crash.cts.com>
Date: Mon, 7 Feb 94 14:51:39 MEZ
Full-Name: Olivier Anh
In-Reply-To: <m0pR7aD-00000xC@crash.cts.com>; from "3NDS3" at Jan 31, 94 5:52 pm
Mailer: Elm [revision: 66.25]
From: Olivier Anh <anh@rbhp56.rbg.informatik.th-darmstadt.de>
To: AmigaE@bkhouse.cts.com (The AmigaE Mailing List)
Subject: Re: New Project! C2E!
Hi Dave
You write :
>
> Is there any way right now to type in an equivalent OBJECT to the C structure
> and then convert that ASCII file to a .m module? Otherwise it becomes a bit
> of a pain to use E, since I learn best through hacking with sample code, and
> all the sample code for this stuff is in C.
Well dave, I did this for the IntuiSup.library. I tranlated the .h into .m
via the includes (.i). A friend of mine (Lionel, in this ML) convert me
this .h file into .i, Then I modified some C structure and constant definition
for my own use. Finally I compile this .i file with Iconvert (which needs
A68K and the C includes) into an E module.. That's it !
The most difficult is to convert the .h into .i. I don't have any C compiler...
Hope this helps...
--
-------------------------------------------------------------------------------
/ / Olivier ANH (ERAMUS Student) |' And may the Force be with You ! '
\ X / anh@rbg.informatik.th-darmstadt.de | - Return of the Jedi -
-------------------------------------------------------------------------------
From donews!crash!rbhp56.rbg.informatik.th-darmstadt.de!anh Tue, 8 Feb 94 07:47:01 PST
Received: by bkhouse.cts.com (V1.17-beta/Amiga)
id <1rgv@bkhouse.cts.com>; Tue, 8 Feb 94 07:47:01 PST
Received: from crash by donews.cts.com with uucp
(Smail3.1.28.1 #18) id m0pTeMd-0001P9C; Mon, 7 Feb 94 14:23 PST
Received: from rbhp89.rbg.informatik.th-darmstadt.de by crash.cts.com with smtp
(Smail3.1.28.1 #18) id m0pTWSz-0000MZC; Mon, 7 Feb 94 05:57 PST
Received: from rbhp48.rbg.informatik.th-darmstadt.de by rbhp89.rbg.informatik.th-darmstadt.de with SMTP
(1.36.108.4/15.6) id AA16082; Mon, 7 Feb 1994 14:56:15 +0100
Received: by rbhp48.rbg.informatik.th-darmstadt.de
(1.36.108.4/15.6) id AA05020; Mon, 7 Feb 1994 14:55:50 +0100
Message-Id: <m0pTWSz-0000MZC@crash.cts.com>
Date: Mon, 7 Feb 94 14:55:49 MEZ
Full-Name: Olivier Anh
In-Reply-To: <199402011022.KAA05246@archiduc.irit.fr>; from "Lionel VINTENAT" at Feb 1, 94 10:22 am
Mailer: Elm [revision: 66.25]
From: Olivier Anh <anh@rbhp56.rbg.informatik.th-darmstadt.de>
To: AmigaE@bkhouse.cts.com (The AmigaE Mailing List)
Subject: Re: Mac2E for 1.3 users
Hi Lionel !
> Mac2E v3.0 is finished, and I'm now working on the docs. It is far more
> better (faster above all) then the 2.0 one. But I will tell you its new features
> when I'll put it on aminet (next week I hope).
Good news !!! But under 1.3 too ?
> For the moment, my problem is that Mac2E still needs Workbench 2.0+ to
> run. So, I ask myself if someone is interested by a 1.3 version. If it is, let
Meeeeeeeeeeeeee, I want a 1.3 versions..... :))))
> I've already think about a 1.3 version. My problem is to emulate the
> ReadArgs() function. To do this, I thought to use the arp.library.
No, try to use the built-in variable 'arg' !
> So I got
> it from aminet yesterday. But when I extrated the docs, I found out that the
> aminet version is only for 2.0 Kickstart, ARGGGGGGGGGG :-( But I'm sure that
> the versions above 39 are for 1.3 kickstart.
The V39 of arp.library is for 1.3 users. The v40 is for 2.x users...)
> So, is any of you knows where I can
> find v39 arp.library ?
I can send you the whole disc of ARP... Just tell me !
> Perhaps, somebody owns it ! Third solution : is any of
> you successed in making a ReadArgs() emulation for 1.3 ?
I don't yet !!!
--
-------------------------------------------------------------------------------
/ / Olivier ANH (ERAMUS Student) |' And may the Force be with You ! '
\ X / anh@rbg.informatik.th-darmstadt.de | - Return of the Jedi -
-------------------------------------------------------------------------------
From donews!crash!dcs.gla.ac.uk!mccracal Tue, 8 Feb 94 07:47:11 PST
Received: by bkhouse.cts.com (V1.17-beta/Amiga)
id <1rh0@bkhouse.cts.com>; Tue, 8 Feb 94 07:47:11 PST
Received: from crash by donews.cts.com with uucp
(Smail3.1.28.1 #18) id m0pTeMf-0001OoC; Mon, 7 Feb 94 14:23 PST
Received: from vanuata.dcs.gla.ac.uk by crash.cts.com with smtp
(Smail3.1.28.1 #18) id m0pTWTC-00015lC; Mon, 7 Feb 94 05:57 PST
Received: from agattu.dcs.gla.ac.uk by goggins.dcs.gla.ac.uk
with LOCAL SMTP (PP) id <29843-0@goggins.dcs.gla.ac.uk>;
Mon, 7 Feb 1994 13:57:30 +0000
Received: by agattu.dcs.gla.ac.uk (4.1/Dumb) id AA08772;
Mon, 7 Feb 94 13:57:21 GMT
Date: Mon, 7 Feb 94 13:57:21 GMT
Message-Id: <9402071357.AA08772@agattu.dcs.gla.ac.uk>
From: mccracal@dcs.gla.ac.uk
To: amigae@bkhouse.cts.com
Subject: Complete function list for Amiga-E
Does anyone have a list of all the functions provided by AmigaE. The
documentation seems to leave out some functions like StringF() which I
only found out about by reading someone elses code.
Thanks in advance
Alex McCracken
Weinberg's Second Law:
If builders built buildings the way programmers wrote programs,
then the first woodpecker that came along would destroy civilization!
From donews!crash!rbhp56.rbg.informatik.th-darmstadt.de!anh Tue, 8 Feb 94 07:47:24 PST
Received: by bkhouse.cts.com (V1.17-beta/Amiga)
id <1rh8@bkhouse.cts.com>; Tue, 8 Feb 94 07:47:24 PST
Received: from crash by donews.cts.com with uucp
(Smail3.1.28.1 #18) id m0pTeMk-0001UFC; Mon, 7 Feb 94 14:23 PST
Received: from rbhp89.rbg.informatik.th-darmstadt.de by crash.cts.com with smtp
(Smail3.1.28.1 #18) id m0pTWxe-00002ZC; Mon, 7 Feb 94 06:29 PST
Received: from rbhp48.rbg.informatik.th-darmstadt.de by rbhp89.rbg.informatik.th-darmstadt.de with SMTP
(1.36.108.4/15.6) id AA16747; Mon, 7 Feb 1994 15:29:12 +0100
Received: by rbhp48.rbg.informatik.th-darmstadt.de
(1.36.108.4/15.6) id AA05219; Mon, 7 Feb 1994 15:28:46 +0100
Message-Id: <m0pTWxe-00002ZC@crash.cts.com>
Date: Mon, 7 Feb 94 15:28:45 MEZ
Full-Name: Olivier Anh
Mailer: Elm [revision: 66.25]
From: Olivier Anh <anh@rbhp56.rbg.informatik.th-darmstadt.de>
To: amigae@bkhouse.cts.com
Subject: IntuiSup.doc Addendum
Hi all,
I post this time a new version of my doc about the IntuiSup...
I added a section about the locale, and some news...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IntuiSup.library IntuiSup.library
The missing DOC
Note : this file is *NOT* a part of the IntuiSup archive. I write it only
because there are some other users who will ask themself a lot of question
about using this library, and may be are as I am, a beginner in programmation,
or simply they wnt to know what can do this library.
There are some things that I don't know about this library. So don't ask me
what does one function do. It is only a summary with some comments.
the (?) means that I don't know what exactly does this function. I don't try
it yet !
This file is more a 'How to use' and 'whre to find that' file than a
technical one, where I can read nothing. All what you will read comes
directly from my own experience. There is no Doc, except a brief description
of the command.
All of this can be found in the example file semed in the archive...
I What is the IntuiSup.library ?
It is a gadget library compatible with all Amigas system from 1.3
up to 3.0. It is written by Torsten J�rgenleit.
The library can be found on Aminet sites, in the 'utils/libs' directory.
II What does this library do more than the others ?
Well, for 2.0+ system user, this library is only usefull in the way of
how you program it in your code.
For 1.3 system users, like me, it is a open door to the 2.0 system without
having it !
Here are the features that IntuiSup allows :
- 3D look,
- all 2.0 gadgets,
- locale available under 1.3 !
- and a Editor, but unfortunately, it produces C codes :(
III How to link IntuiSup with Amiga E ? What about the E modules ?
This is a critical point. The only way for E user to use an shared
library, is to convert the pragmas and the include files into E modules.
Pragmas : you can find the pragmas file called 'IntuiSup.h'
Beware, there is many 'IntuiSup.h' files in the archive.
Then use the Pragmas2module program to convert it. Place the
resulting 'IntuiSup.m' in the EMODULES: directory.
Include : There is no IntuiSup.i file in the package. The only way to do
is to convert the include 'IntuiSup.h' (not the same as the
Pragmas one) with a C processor into 'IntuiSup.i'. And then
convert this latter file with Iconvert (which need the SAS/C
Includes and A68k). Place the result in the 'EMODULES:Libraries/'
directory.
That's it for the modules !
Note 1 : I translated these files in E modules, but modified some constants
(They are very very long : some are 25 chars long !)
Note 2 : In the Include file, you will find a C structure for the gadgets
with a C union within. Just erase this structure, we don't use it
as far as we will use E lists and the GadgetData structure/object.
IV Is there something special in the use of IntuiSup ?
Yes, it is the internal variable, which is used in fast all the
fonctions. This is the only way to the library to know where it is !
This is because the IntuiSup modify all Intuition messages by adding
its own. So it is not very painful to add this library in your code,
because all message will be send through intuition. The only minor
difference is to replace the functions GetMsg() and ReplyMsg() with
IGetMsg() and IReply(). That's all !
For the lists and structure/objects, lists must be 0-terminated.
(INTUISUP_DATA_END = 0)
V About the gadgets, how do we code them ?
Simple, we will use lists to create our gadget.
The way to do it is :
DEF gadgets
gadgets:=[ type,flags,x,y,w,h,text,textattr,data1,data2,data3,
type,flags,x,y,w,h,text,textattr,data1,data2,data3,
.......
0, 0,0,0,0,0, 0, 0, 0, 0, 0 ]:gadgetdata
Note that you must have at least in the 'emodules:libraries/intuisup.m'
module the gadgetdata structure/object. The union can be deleted. This is
the object equivalent to the C structure we must have :
OBJECT GadgetData [
gd_Types,
gd_Flags,
gd_LeftEdge,
gd_Width,
gd_Height,
gd_Text,
gd_TextAttr : textattr
gd_Data1,
gd_Data2,
gd_Data3 ]
You will notice that the string gadget need a 4th Data. You can add this
one in this 'onject' before compiling the module, but don't forget to add
a 4th NIL data in ALL gadgets...
Entries :
Note that these entries are definied as constant.
type : one of the ten gadgets (1..11)
1 = Button
2 = Check
3 = Mutual Exclude (mx)
4 = String
5 = Integer
6 = Slider
7 = Scroller
8 = Cycle
9 = Count
10 = ListView
11 = Palette
flags : 13 flags are available
1 = gadget disabled (ghosted)
2 = no border
4 = Highlight with Complement colour
8 = vertical orientation
16 = Hot Key
32 = No text Output
64 = Text is displayed on the left side of the gadget
128 = ----------------- ------ right ------- ----------
512 = ----------------- above ----------
1024 = ----------------- under ----------
2048 = Button toggle
4096 = Button image
x,y,w,h : coordinates of the gadget
text : a pointer to a string or a dynamic string
textattr : pointer to the TextAttributes strutures or a list
datas :
here are the meaning of the 3 (or 4) datas for each kind of
gadgets :
Button :
data 1 : button state : 0 = not selected, 1 = selected
data 2 : button image (not selected)
data 3 : button image (when selected)
Check :
data 1 : check state : 0 = not selected, 1 = selected
data 2 : check pad1 (?)
data 3 : check pad2 (?)
Mutual exclude (MX) :
data 1 : # of pixel sepring 2 radio gadgets
data 2 : num of the active entry
data 3 : pointer to a text array or a 0-terminated list
String :
data 1 : length of the input
data 2 : offset of the next string gadget to be activated
data 3 : offset of the previous string gadget to be activated
data 4 : default text that is displayed
NOTE : this 4th data is NOT written anywhere. The
author says that there is 3 datas in the
GadgetData structure/objet.
Integer :
Same as String
Slider :
data 1 : minimum level
data 2 : maximum level
data 3 : current position
Scroller :
data 1 : # of visible entries
data 2 : # of total entries
data 3 : cuurent entry (the top one)
Cycle :
data 1 : # of pixel separing pop up cycle (?)
data 2 : # of current cycle text pointer text array (?)
data 3 : pointer to cycle text pointer array (?)
Count :
data 1 : minimum value
data 2 : maximum value
data 3 : current default value
ListView :
data 1 : # of pixel separating 2 entries
data 2 : current entry (the top one)
data 3 : pointer to a List structure/object
Palette :
data 1 : # of bitplanes to be displayed
data 2 : first color in the palette (?)
data 3 : selected color
Example :
DEF gadget,internalvar,txtattr,gadgetlist
internamvar:=IgetRenderInfos(screen,RENDERINFOSFLAGS)
txtattr:=['topaz',8,0,0] : textattr
gad:=[ 1,0, 10, 15,120, 13,'Button1' ,txtattr,0,0,0,
3,1,530,167,120, 13,'Mutual Exclude',txtattr,0,0,
['1st item',
'2nd item',
NIL],
1,0,370, 15,120, 13,'Button2' ,txtattr,0,0,0,
0,0,0,0,0,0,0,0,0,0,0 ] : gadgetdata
gadgetlist:=IcreateGadgets(internalvar,gad,0,0,NIL)
Note that you can't pass this gadgetlist in the declaration of a window..
To display the gadget, you must call the IdisplayGadgets(window,gadgetlist)
function.
The same is to remove a list of gadget from a window, you must call the
IremoveGadgets(gadgetlist) and then, if you don't want to use anymore
this list, call IfreeGadgetList(gadgetlist).
VI Are there others structures/objects ?
Yes :
the BorderData, which allows you to draw 3D border
OBJECT BorderData
bd_Type,
bd_LeftEdge,
bd_TopEdge,
bd_Width,
bd_Height ]
the TextData , which allows to pass text and text flags to some functions
OBJECT TextData
gd_Type,
gd_Flags,
gd_LeftEdge,
gd_TopEdge,
gd_Text,
gd_TxtAttr : TextAttr ]
Note that it is possible to make an E list of any number of Data, in the
form of the GadgetData above.
VII And about requesters ?
Sorry, but I prefer to use the great ReqTools.library
However, requester and auto resquet can be made. There is no file
requester :(
The structure/object is called 'RequesterData' :
OBJECT RequestData [
rd_LeftEdge,
rd_TopEdge,
rd_Width,
rd_Height,
rd_Flags,
rd_Title,
rd_Texts : TextAttr
rd_Borders : BorderData
rd_Gadgets : GadgetData ]
VIII Do you try then menus ?
No, not yet. May be sooner than I'm thinking :)
The structure/object is named 'MenuData' :
OBJECT MenuData [
md_Type,
md_Flags,
md_Name,
md_CommandKey,
md_MutualExclude ]
IX You said, the localization is available ?
Well, yes. As far as I saw in the doc, a fonction can create a
'Langage Text Array'. We can find in the archive '.langage' files, so
I suppose that's the locale is implemented ! But, looking at these
locale files, I notice that they are ASCII files. I'm not sure that
locale files are in ASCII form, but in some IFF form.
Sorry I don't try to use it...
Conclusion :
Well that is all, folks ! I hope that you will enjoy using this library.
I think more particularly to 1.3 system users like me. If some one else
is making a 'How to use' file ; please mail it me before end of July 94
(I'm returning to France, yes I'm French, studying in Germany !)
Olivier ANH
--
-------------------------------------------------------------------------------
/ / Olivier ANH (ERAMUS Student) |' And may the Force be with You ! '
\ X / anh@rbg.informatik.th-darmstadt.de | - Return of the Jedi -
-------------------------------------------------------------------------------
From donews!crash!rbhp56.rbg.informatik.th-darmstadt.de!anh Tue, 8 Feb 94 07:47:35 PST
Received: by bkhouse.cts.com (V1.17-beta/Amiga)
id <1rhd@bkhouse.cts.com>; Tue, 8 Feb 94 07:47:35 PST
Received: from crash by donews.cts.com with uucp
(Smail3.1.28.1 #18) id m0pTeMn-0001P9C; Mon, 7 Feb 94 14:23 PST
Received: from rbhp89.rbg.informatik.th-darmstadt.de by crash.cts.com with smtp
(Smail3.1.28.1 #18) id m0pTWXj-0000yhC; Mon, 7 Feb 94 06:02 PST
Received: from rbhp48.rbg.informatik.th-darmstadt.de by rbhp89.rbg.informatik.th-darmstadt.de with SMTP
(1.36.108.4/15.6) id AA16120; Mon, 7 Feb 1994 15:02:03 +0100
Received: by rbhp48.rbg.informatik.th-darmstadt.de
(1.36.108.4/15.6) id AA05063; Mon, 7 Feb 1994 15:01:37 +0100
Message-Id: <m0pTWXj-0000yhC@crash.cts.com>
Date: Mon, 7 Feb 94 15:01:36 MEZ
Full-Name: Olivier Anh
In-Reply-To: <m0pRJYz-0001LPC@tsunb.ctn.cogs.susx.ac.uk>; from "Robert Dabell" at Feb 1, 94 11:46 am
Mailer: Elm [revision: 66.25]
From: Olivier Anh <anh@rbhp56.rbg.informatik.th-darmstadt.de>
To: AmigaE@bkhouse.cts.com (The AmigaE Mailing List)
Subject: Re: LIST VIEW
Hi Robert
>
> > I'm try to have a list view with the IntuiSup.library
> ^^^^^^^^^^^^^^^^
>
> What exactly is this, and where can I get it?
>
You can get it on vertain Aminet sites... I found it only on :
- ftp.cs,tu-berlin.de
- ftp.wustl.edu
- ftp.etsu.edu
The archive is 571 Ko long !!!!
You can find my an updated doc in the ML of E
Bye !
--
-------------------------------------------------------------------------------
/ / Olivier ANH (ERAMUS Student) |' And may the Force be with You ! '
\ X / anh@rbg.informatik.th-darmstadt.de | - Return of the Jedi -
-------------------------------------------------------------------------------
From donews!crash!comlab.oxford.ac.uk!ecs.oxford.ac.uk!m88jrh Tue, 8 Feb 94 07:49:17 PST
Received: by bkhouse.cts.com (V1.17-beta/Amiga)
id <1rje@bkhouse.cts.com>; Tue, 8 Feb 94 07:49:17 PST
Received: from crash by donews.cts.com with uucp
(Smail3.1.28.1 #18) id m0pTeNh-0001OoC; Mon, 7 Feb 94 14:24 PST
Received: from sun2.nsfnet-relay.ac.uk by crash.cts.com with smtp
(Smail3.1.28.1 #18) id m0pTYu6-0000qwC; Mon, 7 Feb 94 08:33 PST
Received: from ecs.oxford.ac.uk (ecs.ecs) by comlab.oxford.ac.uk id AA04992;
Mon, 7 Feb 94 13:32:38 GMT
Received: from ecs.ox.ac.uk (booth29.ecs) by ecs.oxford.ac.uk (4.1/ecs.1)
id AA15531; Mon, 7 Feb 94 13:35:46 GMT
Received: by ecs.ox.ac.uk (4.1/ecs2.0) id AA00903; Mon, 7 Feb 94 13:34:15 GMT
Via: uk.ac.oxford.comlab; Mon, 7 Feb 1994 15:39:37 +0000
Date: Mon, 7 Feb 94 13:34:15 GMT
Message-Id: <9402071334.AA00903@booth29.ecs.ox.ac.uk>
From: m88jrh@ecs.oxford.ac.uk
To: amigae@bkhouse.cts.com
Subject: Re: Problem child program
Jeffery C. May wrote in with a problem, and supplied the complete program.
Although it seemed to work it was giving Enforcer hits, which he wanted to
remove. Now I don't have an MMU so I can't run Enforcer, but here's a little
look at what the problem might be and two possible solutions (amedex2.e and
amedex3.e). (The complete lzh archive is pasted on the end...)
First off, Jeffery had:
> /* Database template */
> OBJECT entry
> memberNum[5]:ARRAY
> first[40]:ARRAY
> last[40]:ARRAY
> business[40]:ARRAY
> address1[40]:ARRAY
> address2[40]:ARRAY
> city[30]:ARRAY
> state[10]:ARRAY
> zip[10]:ARRAY
> phone[20]:ARRAY
> expires[9]:ARRAY
> computer[20]:ARRAY
> ENDOBJECT
Well, this isn't wrong, just a bit large (especially if you want to reserve a
block of 1000 of them...). It would be nicer to just store pointers to the
strings in this object, so this is the first change:
/* Database template */
OBJECT entry
memberNum, first, last, business, address1, address2,
city, state, zip, phone, expires, computer
ENDOBJECT
(In retrospect it looks like Jeffery really wanted to have E-strings in the
object [something from a STRING declaration or String() call], but this will
do for those, too.)
The next problem was reading a lump of memory from a file (in read_list()).
The code is OK, but then Jeffery tries to use the lump as if it were a string
(a normal string not an E-string). As it stood, the code could run off into
unreserved memory because the lump was not NIL terminated (so it wasn't really
a string). This can be fixed by making the lump one bigger and sticking the
NIL at the end, so this:
> flen:=FileLength('current.dex')
> IF (mem:=New(flen))= NIL
> ...
> IF Read(file, mem, flen)<>flen
> ...
becomes this:
flen:=FileLength('current.dex')
IF (mem:=New(flen+1))=NIL /* We need extra byte to terminate string */
...
IF Read(file, mem, flen)<>flen
...
Close(file)
mem[flen]:=NIL /* mem can now be a string (but not an E-string) */
Now Jeffery commits a real E sin: he treats the lump of memory (which isn't
even a string) as an E-string. This is because he uses it as the first
argument to MidStr() (see the Reference.doc). I don't know how he gets away
with it, but he does. This will undoubtly cause memory reads from unreserved
memory. And in fact the MidStr() was overkill: all he need do was increase
the pointer "mem" appropriately. Also lurking in the code was the invalid
call to Val(). The second argument *must* be a pointer to a variable (or
appropriate memory), and not the value of a variable. Therefore the second
argument should have been "{a}", not simply "a". So, this:
> tmp:=InStr(mem, '\n',0); MidStr(st, mem, 0, tmp)
> numEntries:=Val(mem,a)
> MidStr(mem,mem,tmp+1, ALL)
becomes this:
t1:=InStr(mem,'\n', 0); MidStr(st, mem, 0, t1)
numEntries:=Val(mem, {a}) /* Must pass an address {a} or NIL */
mem:=mem+t1 /* Now mem points to start of next line */
or this if you want to check that the number is valid:
t1:=InStr(mem,'\n', 0); MidStr(st, mem, 0, t1)
numEntries:=Val(mem, {a}) /* Must pass an address {a} or NIL */
IF a=0
WriteF('Number of entries is not a number!!\n')
CleanUp(21)
ENDIF
IF (numEntries<0) OR (numEntries>MAXENTRIES)
WriteF('Invalid number of entries!!\n')
CleanUp(22)
ENDIF
mem:=mem+t1 /* Now mem points to start of next line */
Now we've hit the FOR loop in read_list(). Generally, Jeffery does something
similar to the following to read each entry:
> t1:=InStr(mem,'|',0); MidStr(list.memberNum,mem,0,t1)
> MidStr(mem,mem,t1+1, ALL)
> IF (tmp:=InStr(list.memberNum,'|',0)) <> TRUE
> jnk:=(list.memberNum)+tmp+2; StrCopy(jnk,'', ALL)
> ENDIF
This commits the same MidStr() sin twice (the "list" entry elements were
ARRAYs and so cannot be used as E-strings). Then something weird happens with
StrCopy() and "jnk" (which is a pointer to LONG ???). So "jnk" is not an
E-string and it's being used as the first argument to StrCopy(), which is the
same sin as the MidStr() sin. If the entry object elements were pointers to
E-strings we could use StrCopy() or MidStr() to copy the string from the
memory block, but as it is we can use a more sneaky trick: the | character can
be replaced by a NIL to terminate each field in the record and we can use the
memory in "mem" (being careful not to Dispose(mem) at the end, becuase we want
to keep it around). [The second solution copies the memory into fixed sized
String()'s, which is arguably better.]
IF (t1:=InStr(mem, '|', 0))=NOT_FOUND
WriteF('Failed to read member number for entry \d\n', a)
CleanUp(23)
ENDIF
mem[t1]:=NIL /* Turn | into a NIL to make it a string */
list.memberNum:=mem
mem:=mem+t1+1 /* mem is still valid */
Notice that there's a bit more error trapping in here, too. (The constant
NOT_FOUND is -1, and is a handy constant to define [you could use TRUE I
suppose but it doesn't read so well...]) N.B. DON'T FORGET TO REMOVE THE
Dispose(mem) FROM THE END OF THE read_list() PROCEDURE IF YOU DO THIS.
Next up is a bug in E v2.1b. It's been fixed in later versions, though.
> list:=list+(SIZEOF entry)
This ought to be replaced by:
list++
because "list" has been declared as "PTR TO entry". However, in v2.1b it
doesn't increase "list" at all :-( Since I am lucky enough to have a newer,
beta version of EC I can reveal that this has already been fixed, so you
should be able to do that in v3.0 when it arrives.
Well, that's all the potential Enforcer hits I could find. The "amedex2.e"
program uses the above method for getting the fields from the records as is
nice and similar to Jeffery's original program. "amedex3.e" does what I think
Jeffery was trying to do, using fixed sized String()'s for each of the fields
and copying them from the input. It uses ReadStr() to keep memory usage to a
minimum, reading a line of input on each go. It also tidies up all the error
processing by using exceptions (which might serve as a useful example). Be
careful to spot the automatic exceptions on String() etc.
The uuencoded archive follows (with Jeffery's original "dex.e" and database
file "current.dex" for completeness):
-------------------- CUT HERE ----------------------------------------------
begin 644 sol.lzh
M'?\M;&@U+3L( #4$P N6Z&+2 !T%-141%6#)(0P:R<Z/:-MJ9_.1QWJZ[
M(RJ%)I8:_QIV#=ST;M6*54@)QRVYYHW3$EQ<A;4?2M]U<CC?#;=+,IX'9L55
M198P80JLA99"RH()J!4:(1X!2TB%-%/ P,JL"JIBJB4*/7149!J)R?_?_]TZ
M8LFF$*[)#\ "/%?#)<CN]Z21IRO %7_0%OS(&/S.@./_(U;SD SW,&U EL ?
M(?.+8VE<@CSB[Z%.39JUZ,UX$_"Z'UGH(\+/QW?!+C>?ZR/.T/W6C^%^ ,1,
MEO_,/'&_.7K\QV_+TU0M\XN>[@E]F'6D\,FP-91^F;^=HE]BWS@^X.#EW&<%
MXK9H\[/]@=G/4 .OVL'*'!GC@I,8.0.#BC@D8P?7'!^V\?B+<<;M)W<EIPW\
M23+M8\:\E)2L (TB9-C3(TF0Q@J2DE>-&XNEHK]*9QDTU6+X) &':QRTX6(6
MBI8/(Y?7</"T73*8'',Q?I.&8T],S-W,<M C51NXA$W(W;H<>U(U3S' [,6%
MW@UY"]>4O7/-7:/"]-1J.MP7%P-_E.7A>LCXZ[@?I?HN?/QCHFJ1FB"T!+/6
M1FH^* *ONA3J\MZ(AKL.Y]L&;M_GY0NE .$+4T"(0P!YPY,J^);RHJ1/#BW\
MF5@$MX\>3Q4C,#)P)4J3*)N(\2SLVH ] CS/RG;_0%'UOIF1ZK4Z;^B:VMEY
M^.PF6\":FG%E$^89 -=/>IFV(BMLD#;B*@CY!A>6A<^V7+[ZY+1@<-[;!7@$
M#[K"-K>+-E2HLB9:Q(O( RU;](R#[Y^6F3ORT[J<]8"H@6><RP6-ZZX46_5D
MF==[YE7,*0;/)TBS6SC6V$+M6O!C1XI+SWBO/6*^S\TVO$BTNV-WX'Z;U?M#
M99FX4_._>#07=]42/2.,]YI*U9OLE6+(C2%")BNFJPA='$-<>WU%UC1%@M(Z
M?$&F3IF*C6@NI:TW(G\7J%IJ?X48O]B::C;8YU'7G4?DKJ.GHJ-=)U1N:ZIF
M BJW.WZ$ D?/G_$G.E@!)9F2:ITO6]@46V$VT!V=%ZOJ5T'0.K; ="W70/
MM%S"('Q;8<4>;.?D#I\S3>VC-O[P7'R4R"V>5&BRR1I9)$F81(D@^4P]O9=@
MY5^*<P^FORUR&TXWCA\C&@SH.,<(GP:O+XA\%P!-O.Y,*<+-W["S)X4CCI1X
MT1=0>XN])5X1U7M3JO>KJN?/]0M W)\;>.;L:JR%A>899BYO,O@V)VAJ@W;G
M"K432U-M[K$/L^TU7!8:KL^9HM5;3BC^':_08T]KP4A>M$),DG?.2_BG&2XY
M3%_QAU@,<S1:^MS-:XQR#\8Y-XY[:[I_=?6-O*).T2_=3ES#VQ:VZ^J+>,P+
M=YJ"U.-*ES"2$K^+IBIYHD?<2_[C4X);C9'PNM0.,[ RS:XO^A_,9FV]FO=_
M\0[3N$..E_PA=LA[&V.-^\,L]CV:A#0UB'LKS5(:;&G\#4(=Y-EQI$67+UW"
MH'\'JMB<@OJA!;:Q!:^EW""E$B2A(&ZUR#L/RG&NV,L4)%0@M]8@['J=T@[O
M7(+3-.-;(RQV&)4(-?KD&RU2#>,&E]J$'BQIF!W1Z?R>J_',K6G8J#VPUAZA
MQ-4>Q&![N]0>RYB4SX>X=9R#C/O3C^UJ#^RUA_L/1[C??)C*]T>L_S'&.W,K
M:Q6H/2:P]:>SJCV]8'N]U!ZKQI,B+_GU;?]XAU=$XY(9:L_OU"*YUR+8]PBQ
M>0K&$:Q/_\2:M;A[9F6M7UJA%=:Q%K.%JD6.QI]][O<>3?JS9@MQF8"OPD>J
M3]PCV50CO/@(^4(Y?&AG9_)-"DW0PG\,,W%8A6=&15HZ.#VHY=K)FZD<GV/@
MCDX#&U<>]')G/OU)4:9%-#]&*++EZ4B#5?-/#\FC-S9-%>2SHL)% \+LM(BY
M"T+NR@GW[(\FVM$,T[X SM*+QW$O!_W_C]"=%N8+0<)'SH#.!6@*U[J"WMW7
MNMEO6&O=;K>@]>[7K>5]>[8+>*U>[9+=_5[I%NHJ]URMR-7NNEGIKW7@S OC
M:,Q_JO1IPPT-#WY'E:1!'?^BNU6EIO[&>/I#':VQ)(,[BAH!P,X'AIX6TCEQ
MG.R'X!'-&>GI$@0K!,"T_K]&T0N_*>'GB1G=9NUQD9HMQW+A!R;@[07R>J,Z
M[1=K<&>:K7FG:R1RY:,^XN4=\^>[K=/=YX#Y[O7SVYFS!Z1&ECRTG#T&:C-W
M;EI(S1\03-;X37Q)SD# ];X3M1N1^3$+0LX!IL$M#Q)R,UV(YT4^J#YZ#1Q)
M!M^P90D2FW<P90;MT6GSYU[5$9.0NYS?]JB'S\@N<WI@%T_^R_^3 +H(S7,D
M$-R]-WK;V(L/YK8 L[ZC=X;;:!WZ;.ZP\$HV7(Y/,&O<* R:7'7#9$A-[$=3
MOKUH-+Z][-WANFOX\E1-4/5]:]A^#G XXX;5PYVS.K!\XJ_T] Z/1@V_2Y
M,_RHL#U<A/JPW2_Q((\W0B&E3Q^"M;@RY7I!70'X<S[4ZL_K_ /E^ADA"^JH
M@3@<S\(E7RX7*4JM^)Y5-BLR<"!YR,VZPR0K1"4$P&]@(+\&]WY@C?('#KZ'
MU[OEND,7EJ90__O1E.2#CV][:LQT;: !% +^3^/WOUSO&PH?4(RA_8/FXL/)
M&M*^QQI4O?SPS,32O6@[/Y4/)&GAP\?46NZ4I&6JG975H%X@TV"ZO?*559T%
MU;P;K"A]852!70NM,ZELY0_4/*%OWFTL%+'G@G2<P;3PMIME&G/L4Z"F;=\L
MB'G80G,J,TW"F9H+\:\2U!2V< ZMBET*9*Y 6GJ57B^7<_V@@YKAS_0>/0P=
M^>^;A^/0EH1H*#V Y?-'X@O-,D1;SV0?D2UL:#4M=@8 ,@7 "U;H8M( )
M04U%1$58,BY%,$L$]W.;T;C5O^//@#_R7DI'>=ZR2^H!"NI2]'/$#NDJDE.$
M7JJMD>SION;UM/==EE*?&[__=;DDDXMM2J!5 @P(8(8QB&$81R0CX'&%#".\
M/=K&VVWVNP%HRS8C*."SQ20F6<.QVJ5[O_(_QX0.E<N>D 1'BQ'ENS1.AD1*
MI;H0F+\XIE(2=2G0-!!*/PK:/C7='KXT+SN@I8A5T/.B1T),L:1^9_-(@>*Z
M&..*299Y:3]VTT:4J7'>NX,(<MGYW[N&_<?P/5JM6K2I"5?A4> ,R%Y0N)P+
ME(J6\R[>P^2W>\-VT]V:U*E:?MD60E*A2['@PWPPWFF6Z"9HGQ^*"'F*;)D$
M=4O!?O<81&0FHX):7+85&=AZZ?-4J8+GT/WK;>\YV-)*N./!=N<@] YI4+/
M;J4^:.7I"S*<P<IXHY<X6888\9EHC2#\LL<H<\'!P<Z:;2:<9W..$YD^&2I6
MJE]Q0/<MC^VDW8>+C@)]-^X&AS&SJ#+'# H%Y3@Q74Z<PCR,"Y(7TDIWV]EX
M1WJ'(\ 2G@\A?5A[9BYU>!"NFHSVDPU&FFL$G%.BXPM(5)&H[$-N.@A8J)AA
M#$<(!6F!IEQQ&Z$8S0PYR($EI$EFD2NOO_NT2W;[]FT%JSAL]^S@?"W?O<H6
MKF#Y0MW.1\&<+\ *Q9.TUR8,R0G2374)R:-\5>KX[& 5B7?_"U<Z"ZP\8N%8
M>MCPN0Z>A>6I3QS2RBO7B@/YJ=#"XLJM86+G<-86 Q8")%7,=J)S^9<I@Q9Q
M=&%&0ML1(23J:A9R3T-4QI4UA%W*.4PL4>UB]C%GN8FH!/.DBZH8ET+K$KZ"
MZ(_;#UZ0Z=IM.A>Y+1)B:9FPGVM9QCTR+P@#ZB.[FLCA%%\4^U&IJ8\&2*7.
M[WB_7K#9*K^P-U]AU<<),^ER'&PDO$03\=AB@B4&/B#&9()CS$TJ:A.E3%,+
M8L:P'UO]EOD<8U" K[L/,@EDMIVFQ&E5SX@#E1 7E*'*PQJI,3D.-,$"P]\Q
MH6=</I-]3C"#Y9A=^D,+Q8BRAY8?: G613L8 %$IGJNQ!HQ6QBPD^ =H<!"F
MEF0P'U>M@FO6ZD]5-)-]VJX%Z_K\/>U0NM@ZN)\IH403B?407L&5?6,F.&C^
M.%=9A^713P2A)(T)6HG !C]2K())%Q@8/*3SIW;%@HC %L2L-8>K%&ITEFP
M=W&1S/%XWO^5;(8?C?NE]N'A8,<'2B0$)0M!H6![(3PD[LI(1VK?"GZ&+?%N
MFB1@SDZ4&6S"R^R'<33,\OBA#605B,D#T.O&<G[VA#_;;X:$0M:G76H:E(L\
M,TJ0] EJ(D,QA0?A$;I.45(W5 I)$_%HF_,3;0%J$]<-;0WZ+&:EE&4:M%J:
MOW00R?L"31'V(%=H1#SJ)"$X#G_C.]1?>E%O_?<BW2?[!YO/LJ.O^CZ[FX^B
M'>\^:*=_K/CWMQ\4#K>?E%6EUGY[^X_*!U_I^5^L_/@_0_*^\_"LMNL^/AW'
MP0VWGHRVE_@]>W5W'JP;[SV&Z5ZSTK;CT$:[SR9?!^RC3_8^Z^X^V#[>?K,#
MUG"#^6[>WN/R?!\?Y#;GPN +SR?V@"@?_J@%MAN22N';AF:3;)<;$>?!>7,@
M9XYAP38X28;? L):(3'">E@KAP:U.*\B#@X.!M;CLLE] 99MC"E#F+$]
MEA=A<VB,RS99]2O>X4#7A%]53220H/ SS4O37B-PFW0=)Y682K*;RE=60SWA
M/.GB#"(%Z89H.@X?_&Y0(!FR,5H/H*TJ9$TB&-0"AM 9S;T6?ZB/,2=+FQS+
M%-Y &4?D5L!F'%2#=/*)PD^-9X.(O;9A5&Z&;*=,]?A+'$)*L-EAJ,O-AZ\H
MV4XW;0LD)6CHFCF4&(<%ITD!!0=$S!D$80DC$+CBF*&5ECFA@).Y0:A>+&X/
M.F @U$0/'(\XSV" >..3.WS-L<V6DJID#DI118I'G$X,2%ZQ64!W\L3&R H3
M_C<GFTWHP+%[!^>)CV8RTFF"Q,QJ,3&..=UM749&BA\+7ABA4I/AAKK_-U88
M;[L,4R-TPA]5]1ZL12W^;"79PA)RP]@.O N"],O1A4-6)+;=N:;X9QO8GOHP
MZKZ0,&%_P!6])8\ZO1^/^HR2&EQ[JB\[+@-W3:*.[;"9W;6<>T":,TWII<'=
M5$*[HG.>WOSYKW7')=VPUM*<?MA4ZE)SPKOKQ;@ UB+2J45:.:F4:,)Q1"A
M'>LM;&@U+<<( !$$P ZV*&+2 !T%-141%6#.$T <F<\/6-IN4_MQQSHXR
M5T40II8KO1IDS<&-LRNNJ--4VX!76L=#2% ^ M&X1OJY&-]NC<P91&84PA19
M+&MJ$(555561A+2FF$!\&554)A52BBRFVJJ-D*ZX1JIII<1&>$U,Y/?^]W3G
M) Q<LE(MLEM#XX=[W62-.1X IOZ@K_, 7_F6(-O_(WMWP0964)X!+, V%FWL
MS85P"//+LX<Z.R3K$9KL,;B]3\#T$=SF8CK;%PO6^!'GYO[K%_#_(&!') _F
M&]&O.6]_?=/R]A,(&67,=0B_)$JR;<E0:BC]HW^Z1+UX&6'MC8X]IEA<)V"/
M/S.N.3QD@#(T;'%&QQAL8J]CB#8],;$B]C\(V/L.WXBWJC5H.K4M&(_N9=X\
MDR+A2*IP@D2IDV1,D2Y2]BDI%3].1OZ6"X$69Z<>.FO7"* 7[R26C#P"STJU
MW)+\+=V6>Y83 O3,7^)NR'SV#,W<22Y)&B39O#)9#5MAMWA&D?*;CDQ87<#[
MQ%O>*M[QC>[%V7L)-!QM\WM!K\=P[+VD=ZLX'??HM?6PCHEBC-$%H"6>TC-1
M] >NRX(_O1']YPFO!%I-Z+2>BZVY><F^ZE&FQWHCVKF"[EH]LS/QBAX^NM>
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
M'8H*!,!M6B"_.NMH8(W:!PZ^B9%OR'*'3Y"6*/[Y(RXI!MX%T\&<_?-8($2
MO1_CSOUSMYQ8GQD81/5/>].)UA]Q;OJCY2NO>B&8G%NF8Y/ZL3K#YW<3J]]:
M[)*@9:I=Q96@7TA\UJRO?),:?J+*W;6W%B=H52!7(NM,ZEJX0_4.N5M]#6UJ
M5=T CT'$*Q\_6^0DSZ%='R4N[;\@B')XHG,IW5LG+1X]&*N"SLBT>Q?FU=WK
M#I>^E7MZAPTMK\WPS;5^#"[KVMD#08 GM)A;W[=I6"_/U>,3:;* 9^=O?IEB
M9!]0> .L7HFTMC\/;@V4D_<JOW,CJ;/JA%S_<!^3+6QH-2VS!0 /Q, $=C
MABT@ E!345$15@S+D6"Q 1K:YO5MM7/G?P!_VX;'L]K)#' 1#$G9'-F$C<3
M;FU-ME5ZU^FK6<;B;;+;C'QN__][SCKEMLJ1D' "#B. YS@.\^!1 X=O#M+&
MVXM_P!B-2;C-0<*3Z=4AJ3AX-]9[@^MO#"!Y:9^A8 TGT\9YW:M+ :(YZ*6
MD,7SQU41RGHH8 T44XX+VO#?8';\D=/0P%%(I5@/?'J8#5RS2CC/SZHQTK <
MDVG552>=9MW$E:++"RF&:4=K+30&B:<*(_>>@)M HF>.7VT$T.%YV"$(/3Q9
M6\O V^[GRL_.P6?&X_!"SY+J,F1JS'P9X''6X("SBS9?A\K6+$^/DO5Z56>_
M7GPN0_:S\R<<$+4+;-ZW?>ES,7@+%F\SSK;-].1OAS."AV?H2A'LN;/"V^/M
M64W.5KA;=A?<'1WKMVZA]<IN>/35I"08J(?0(Y0BKD_HCD.!I8@FIY3SA50?
M15(,0*X4ZX*"FL@O2*7O^1@&WL;/B&2[KT/%C>SNXARK#&[/E'Q-OOCH7WRB
M*G!C<R-IPP"SKOE3C?;:Q)P^=K(I_D>=IWRJUSCKD*<+KW T^LL^TY WTHD'
M,80(F!<79=<K0U:^+$.A=/S;?<3*)]SVH\J?>LMB;QC"JBG!FA?"%Y-5K 2U
M:6QPQE2]QU:- TN+9GWL(:31CNP\S3N+(V+AHW;)+"Y YZ1A.E K^"R3:XZ9
M*#P,EK@&4J<X&DYC=% <LTD5 #)$$2D57Z55B->,E!04YS1<19[A)#FGCI/?
MBCH]PYASE7?(<TN?4+.\T<D@:)SG YN3E"6:7Q"]@'D/I%G2H01YT-264ER2
M95$TJ'Z_$5VTPZ46#;X<+>:%9$0C\_(?53'-*RJ/*-SZ"93'<WO1-/[@:%L
MRIWK4DDW(8M>#<\XW&^N+O=[UR[S"%&3GC=TYC'[K<36H%RO5*/2Q5O?K^WR
ML!*F<,34+7 T-'>-][*&)R#[ 10 C1?LA43JZ8X63O*B\K1$4NHMD]2K*O9@
MKKLHI]5^[9F,P%.D>+:F\._+=X&45 [W)5/.,@_'$?G&!+V3$30HF:,8;CXK
MX:ZKA;$DFNR-+JX"Q 7!4-WV$P2X0^9MT'S1T'N5V@E$^RL# SYS27"Y:?O-
M^"Z4X9F[V;@;DU>RY9N_INK@\_;X?JZ:U^Q!(O(0WZ;%:[. #&*$-@9O%;#8
MBUE77=;U%%2U[$1D_%[2G4NA##&' S=6UI*F]@9<E)*%OF WOAO(D,N-^]?&
M)V(U'#FE'%/;QZ^K' RKASMZ*DZC+'$E26Z]+AZY[>(EO8TM-[PWO\:A':?:
MTB.K_:T%?;O_K.%WRVLV7:=M9I( O<S-8'FUG:^^#:T-@*?<TM816UI:P.&U
MI; H?R:6_W-+?_)I;__M*0DNUH2#,;6=2)QW,R@6_:S2!$^UFU#!]S."-UM9
MH15^UF$#F=S+((#VLP@9[M9I1"_<SBB3MK/*'G[6@UDR?^L-44WV6(J(R]UB
MJM;_#2I !E\^'J&-)#VB 260'OF&(!=_'< XM$XH)<HCG;LA*?MY$&9:Q%Y)
M-I1#,@I^P4QGE-QBAJ9@F$,"A)B*%7MV9!0-FSPS521"-#I0(0(%\/?(0YLZ
M08O8@!"D;-^[V; (Z$(XRD7V(! 4;8@G)?N-)'W+O (TA T:P*IU(H0C^Q$X
MRB*>6(\0:ISZ34U3GDZ$'($D#5(\VQ#)+&6H?+'0/8;[0[_P[Z")WY[M(P7X
MR%,D@N=1Y3XL.-%J9RCC3;A_9!U#"=9Q 6)(J2'\D'=A8!)!<S )%@B7.[:S
M$\+-H_Z:JL?TZWZ$#^DFD[85)*6E58B#Q-84(T+Q!4%-T]936]=L*ECZ!8<;
MVSTP4Q/54Z[,JTYW4=_H.KU[BCX?O_5EW>D8LH\:'4*X8#8(!ZPM5H-/MW]H
M$?I[N+>R=74UV[K7T*=7+_T\="_]<8U9>2R/ R'7V\;BJN A:BUL:#4M $
M ' ! #4N$$<( +0U524D5.5"Y$15A'" $D6Y>MI1[G/ &R/ +P:%MU0+R:
M HI$D. D>;YCYM84OV?UPP9_QOPKS/6T &"G3B9GI36/'BFP.J:A([( KUE
M=.$[YBHN*MPUVR*)6=49G6K8$2D*M$#KB**3S"![[SDFJI*5M92G>Y;O!3\K
MJ,[FYD=DI7D?E2KG"P%-6M>1;EIB[:]D.0IY1B,MXG8FT0KMF8BK:9<+ZYP*
M5R/>JKZ"(@K2<.G^S>]S4R_;-W\S>]Z:RMDK'N,(3(\:>Q3NM#Y2J,87%*CT
M*,0EP$T8SQ6KWA*8G=\ ?).YC:-":2,.D,)GV>M:QK/UZYV:AE.";\>O30=_
M/GUPYC7@$*ZU,0 9/BUL:#4M# @ @5 "UDT(<( #1$58[A(&='/#UC:;
MEO[D<<Z.,<=B:BFE$;T:9,V5UM@C7&FF2;<"66*WI;)* JC7-A&^LD9'V=;F
M*E$)DIA"BRUMU$(50LA9",):4UPBBWQ50F%5+$(3QJJKLA;&%,D\9ZD4SLS4
M3D]_[GSZ$@,H%EN^#B5*[Y9NW=8VU)90"E_V$_Y8"GU-]T4_^#<W&^!;L+5R
M!+( ^T[:61F5J!_,+8VTB$M19GQW 2<+H>LZ ^ZSN.WM"XOL_ ?S,_^=@\MO
MUAB0B/?\ANAKR$^?Y6[PO51![FESF]J7K/V)/,)3FHG_B-^;GE^-[FA^D4,J
MSS0W:.O/YF=\8N<E ["2&O30](4,D4,!1#CBAYXH2*(?A%#QW#P1;T1JS6]
MN6<_>7<3TW,.\W<6!%]0+R_C1[R->1+]1"A%@(^E>;S08M[ C>E"A(J5P@ &
M&YAEG6V(68A6N(9?A:."S&RR,& :Q?XFBT>/5-9NUAEED7H,FEL38#5N!3N2
M+X64T%S&PO=CSQT^?23YR3<[!P7JH+Q;<%I9C7X35P7)/W2=P/X?WV_LXJ4)
MI#XZ(-WF=^X0B<)?R3XY_G@E=2LV70G4LIT(K975OV06BR\D;KP"Z&UTXAS\
M <;B)%OB/8L& 3S(.]B1?4(]APXF\@&L-)MHL6)%)KX=W7UZ\ = 1QG<EN\S
MQA]5?FAZ*]*-M34YZO.XZD99/H\*%!BD^^: +^V^NS.(B^N@ PRC)S0>KW*4
M3 _\!B"7)M^R65XUN68^W#JR!F /OU(AXSPLM20L=Y'BQ8-_&<W<'? : ^)T
M30$6.<3QRSC(:K=)G?EI'>U4>VUU!WJ,0UY7T'=,YP 8X6@:ZK:&IJ06L7VE
MY#@DW:1I3-$\T\N>:6-H9O$DS=,:O)]U-+_H:*TV$7R_Z@N&]?KB19J0S\C0
MEL^X^(C!O[R_0)"&=+TA#K.MH"%CQ4YC,&P.:E'Q!IHZE8F\ Y.2L38I?<]L
MLY#O2,<!]WW)'@I2-FE(]DG(YU"1IQ.D-CS2EX*#5:9_12@=5EB[L#7AB[S)
M]D\]6->6E&=:+"RGIQ1Y22-\*,<;.=R$T]!;+N) OI4@[DIN_'-CC16#(S85
M^0)?RKX%Z-$)X.@$_13"<HD/.Y+V20[N!=+)_K.#V@O0G\KM3^[27J0'OREC
M,H'UA(*/PV[[.@XR?;++NI J\D8ODZ+^;"?/D;#',__])+'B4"3&7)1?*;!\
MY-8<]4FL#80V7;@O@F+3NE'::+K]95J<M4JZSWE"JY5*M3UE2K4XJ15<ZA5U
MGE]XJN?_E76JE5A*4*NW\)57JE5?V$BKM]0JL,#O%7;ZI57VGA*M6H5=^J55
M^S\)59I%7?ZA5J>1WBKO]4JU"*I5J;*@56H]:D.4J6:CT%2S46)E_S0GOSE?
MC=TNV5%Y^LPG?F5,*_T-(P]-4PG;Y4PG;E0P]/4,-1UM,P]/5,-/B*F&HWVD
M89:IAI^*J8:? 4,,O4,)V?IF&7JF%=D*F$[BZ1AS%3"NYRIA7<10PYGU&'6Z
M9AS-4PTTI4PT_.T3"L!4PTW45,--S:!A[<)\$YL?G,.B\_^,*Y4PKNII&%FJ
M85N4J85LE0PL]0PKMSIF%GJF%:U5,--E:1AUWA,+'OF&Z4,-+\BAAUVH8:;
MTS#KM4PTKY,PCLLY^UC: 3[,G@&U.]P.IM?A\O#GC$9GPD]HS/U2M#9LS*"'
M2V"Z^)'[FP3^3Z=@F^4=6GS;!,D(4'XXMY&@FV81@.LQ=#8/TF D$S:[<U5P
MGM,9BD1.[6S%Y$_9BK)"3^L2VK,_6JSKX3SH;4W7^G@_5_);@-/5WFB^CJ*1
MKK='2QC7.T=$Z-=AH]]<:_=[H8HV='L=BCK:/5M%'K:/2?%&2CG1%&UHY Q1
MMJ.#44;@=V7NJ&\%\&!><_#/]_Z=IBEM#1@?Z$[C9O;P9CX&.:;%>2("VSEY
MX;;-!P;P+-A#+BM:D?!RY@^![FD?6U;" L[V,:P.N?5<)>!='P),>LQ3XXW4
M[!H<8<TLM-3UQ\!7,;S\*/*19F\!R2&64?)L[<^Q=NMCL77D;-VZVCMU;QXR
M,>,;<CEFM'0+4%K=Z6:?'(-.?X@GS9#4# ^?X@]!D1X3$++KWQM[R67YL@^.
MW$<T(^B#MT"YI$'!W$!@UM8H;)L6=S9%[2$6-00K+F0R_D@=YV.7-93@"X><
M1Y]M\7/-X.5-W8?Q[*3VRHO?T/+497L'1N@:RKAM'Y3 K[Z9<X;"K#QX2VX
MP\$HT6HJ>,//7H L76?8"I);,JX6FQO5P\7=[EW.&V7_MR$(2(>[\%Z_\G-!
MI@!6-&OBK:4';2E]_&M7V-C6KWXN!)]6"^]W'A==^V3\::.4T+L;>90^&Y9
MLX7("J?/ XW%D4WR_V#[WM9 6WY$#B;;C?L$J\&VX2%)M9!C:*5:3;/O7/CW
M&&2VL#HH1@95H@OR;W:F"-\<D'7;_L7/#;'<_AH=(?_7(CU,!3O;UR/2T=L'
MP$0 O._OR^I(W.$__H18__.DMY[_('G ONB/%"]]Y^:Q.!>KA<_N/\@>.X?]
M'N378H3335#+3EH%]$>-:G+W:%)3=!.6VEQA/\D92!6RE\IW\!QLLOL5=:A7
M<T(4UK:V'E5?BH+N;70I:&9<\,AWKX0G,I\<V&&-GIXH\1R"%DT!M9%+GSB5
M1PVGH4GG\&W_Y:@UJA7^TX=!@[5*N;#N.4%<1<,#IQ5\H^/ S#1$V*= GG2+
M.666T\1"L:^4T>^YP(4PC<>U=[">+=R?'&Z'+!L,+6QH-2W.! RA0 ,F3
M0AP@ 5$15@N19\G [-KF]6VU7^=_ '_<4;N:MCAC@LV>2=D<I ECJDEU E$
M)ROTM>KC;3?H746^-___O-MR22B*7;A$*@M,"P'*'9#B.>'$=P[W1M-U^WMP
M :R-O&]2@;@_1?J_T.@T>!V$[JX6X>?=#DE-('#)%EC#B-DQ#^EN',I<LCYS
MFA!^$&UP^PTDK\4(5MUC%7#E?A.:1<&-_?\B4]/UO**"^[+IW<3LI@.;)' Z
M<Q=#G!\K=C !H3R=B@#\R(>=W+DP_']5=J]>:^A'-C?DE/A\E7/QP._=Q8LL
MK\)I9=7,Z\](/*QW\U;5S<[Y^S#\6CBE.(OPL:./[7X]7#'TQ0FPUM'&;U1O
MBY,._H<,62/*,*LR6W=LI@6HI8<NW\ <37SMW<%ZVW?9!BK5JHB'=-SB,'9.
MP.&"+$[ 'H=D?=Q0&E*)EENT4/P]OP6!QQ(E'*!XB2HA9+LAG:%Z!^4]?CP7
M@P.)DII7ODBZPZS5(( RE,CI-0Q(((N<81O3LB'+D;%??-*N,E<>,:1\[(&<
M!4M18T.444J4$S[!Z>B@J...\Y8#(Z_"JLHB'=NT"J!*S=-UJJW[?TMN6DBM
M;<IAHLLR%VW<4G>95;FM*U.6*3J!H3D5;I#EI(Y*L5N22*0.9[Q>+FAJ+H@6
MM0P+$!G8>2-5BK3QC+2W:FIX(Q5V24R+\QR=@ZW>R4.F*!Z5$+D%>:G<CZA/
M$SYQ%P)6V1!.8#H0A&[WUE^ZJ0)UDI5GGY>J>#UE^6.*4RJ501 40%"H\_+Y
MO%2_>;:LA9:P-<#5]L+5YSB"S;O_,%JW<;!"%X,5$L,XG2%AH2QP&A7&\F R
MXW<%7U?&55WAH0!\01\D;-4?Z87#TP]4]1-QP45/@'%AUV;0L.X:'H/TJU.?
M+)(,_=T?%'46HHA&DI-$!*'MH+P#XB(I"M-]E!:*"/UH"G:O-"0>FH!HF((0
MS5@% 2NRY&:'20%W+EDHUB,>X8)J@B%6?AZ$1)^ ?%[WADLA]H!ZZ(FK>;SE
M_7L=93(_%UUOP==B J@R5)CH,UZ[-N&^>15#YJ%!2JMY0XGWBY)3S!*JB@-+
MGI\(==GT.P(674]4RL7"7V*EXQHR:N7)G>GP0S2$3Q6G+P.CQL%2C2V@OX&^
M,&%*"*=C.*:GKT"<FONT>J-#[JKG8I@'VAAB@+SH)3_S0.U-%+O6#S><,%[D
M;4S^;\K$6=2@MXR/=;R@++L11]BHHB]2IJ>=,G?@9D>W/WF+P,*69X%VE+VE
M<L#?85D,O6522MI4GP^=A8H9^LN3IVTP3XX>PP4,_68)T[_S!6_TP5OY,%;:
M8"S5]A<0R]98)*VE1&@SL*J69K*R$O:5QTW=A5)E:RF*3M**-9W84TLS654)
M>TKS;,/^81<[/UER9-_[P:S;E?N+];]"_0T/?X/ID[^S"G*))E>/3M69\S8<
MIO3K?(T+OORR*-=#7KGHSS*=U LY M_DMC /WUS]&S/FUKDZ)8[;O=FZ]VG9
M%EFTZ NM\O\:=(8QX$ ?]M95 !$.5V;YCWSO.93S:2>C6O3K04Z"*WNT+^W4
MOYI?7^?U/OG9L_!3M_QI<V9<%.3&&G&5#3AA][$HP 0I]F89O30%'F>[U]/C
<D#1X%0T6*+?U7-GV'T_Y[Q414RE&6F>O[MK] +$H
end
-------------------- CUT HERE ----------------------------------------------
As always, I hope this is helpful...
---
_____ _
/ / | / /
/ /__/ /__/ Jason R. Hulance
/ /\ / / <m88jrh@uk.ac.oxford.ecs>
|_/ . / \ . / / .